package progen.roles.local;

import java.util.List;

import progen.roles.Dispatcher;
import progen.roles.ProGenFactory;
import progen.roles.Task;
import progen.roles.Worker;
import progen.userprogram.UserProgram;

/**
 * Implementación del rol de Dispatcher para que funcione en la misma máquina virutal que el Client y el 
 * Worker.
 * En este caso no hay ningún tipo de comunicación entre los distintos roles, excepto las llamadas 
 * a los métodos públicos de cada componente.
 * 
 * @author jirsis
 * @since 2.0
 */
public class DispatcherLocal implements Dispatcher {
	/** Fábrica general de roles */
	private ProGenFactory factory;
	/** Representación del único worker que tiene sentido a la hora de ejecutar en local. */
	private Worker worker;
	/** Hilo que se encargará de calcular todas las tareas */
	private CalculateThread thread;
	
	/**
	 * Constructor genérico de la clase.
	 */
	public DispatcherLocal(){
		factory=ProGenFactory.makeInstance();
		worker=factory.makeWorker();
	}
	
	public void start() {
		//do nothing
	}

	public void addWorker(Worker worker) {
		//do nothing
	}

	public void asignTask(List<Task> tasks, UserProgram userProgram) {
		thread = new CalculateThread(tasks, worker, userProgram);	
		thread.run();
		//new Thread(thread).start();
	}

	public List<Task> getResults() {
		return thread.getTasks();
	}

	public void stopTask() {
		
	}

	public int totalTasksDone() {
		return thread.getCompletedTasks();
	}

}
